﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

#pragma once

#include "GcmpModelInterface.h"
#include "GraphicsNodeVisibility.h"
#include "IExternalObject.h"
#include "NdbDataSchema.h"
#include "IDrawingViewport.h"
#include "IDrawingViewportCamera.h"
namespace gcmp 
{
    /// \brief 图纸中视口接口类。
    ///
    /// 查找、设置视口名称；查找视口对应的视图以及视口所在的图纸。
    /// 查找、设置视口左下角位置
    /// 获取视口大小，视口大小由对应视图的裁剪框大小（或者包围盒大小)和视图比例决定。
    /// 对视口可以进行视图锁定和去视图锁定，激活和去激活操作。
    FINAL_INTERFACE class GCMP_MODEL_INTERFACE_EXPORT IDrawingViewport : public IExternalObject
    {
        DEFINE_CAST_DERIVED(gcmp::IDrawingViewport, gcmp::IExternalObject);

     public:
         /// \brief 析构函数
         virtual ~IDrawingViewport();

         /// \brief 设置视口的名称，同一图纸中视口名称唯一
         ///
         /// \param name 视口名称
         /// \return 返回true表示设置成功，否则设置失败
         virtual bool SetName(const std::wstring& name) = 0;

         /// \brief 获取视口名称
         ///
         /// \return 返回视口名称
         virtual const std::wstring GetName() const = 0;

         /// \brief 是否支持视图视口一对多
         /// \return       bool
         virtual bool IsSupportsOneToMany() const =0;

         /// \brief 获取视口序号
         ///
         /// \return 返回视口序号
         virtual UInt16 GetIndex() const = 0;
         /// \brief 获取视口对应的ModelView的Id
         ///
         /// \return 返回视口对应的ModelView的Id
         virtual ElementId GetModelViewId() const = 0;

         /// \brief 获取视口所在的图纸的Id
         ///
         /// \return 返回视口所在的图纸的Id
         virtual ElementId GetLayoutId() const = 0;

         /// \brief 获取视口在图纸中的左下角坐标
         ///
         /// \return 返回视口在图纸中的左下角坐标
         virtual Vector3d GetBottomLeftPoint() const = 0;

         /// \brief 获取视口在图纸中的右上角坐标
         ///
         /// \return 返回视口在图纸中的右上角坐标
         virtual Vector3d GetRightUpPoint() const =0;
         /// \brief 获取视口尺寸
         /// 
         /// \param length 保存视口的长度，水平沿X轴方向的长度
         /// \param width 保存视口的宽度，竖着沿Y轴方向的长度
         /// \return 返回true表示获取成功，否则获取失败
         virtual bool GetViewportSize(double& length, double& width) const = 0;
         /// \brief 获取视口的TiltBox3d
         /// 
         /// \return TiltBox3d
         virtual TiltBox3d GetViewRangeTiltBox() const =0;

         /// \brief 创建视口相机参数
         /// \param[in]    const Coordinate3d& coordProjection  投影坐标
         /// \return       OwnerPtr<IDrawingViewportCamera>
         virtual OwnerPtr<IDrawingViewportCamera> CreateViewportCamera(const Coordinate3d& coordProjection) const = 0;
         
         /// \brief 获取视口是否是内外框是否一致的标志
         /// 
         /// \return 返回true表示获取成功，否则获取失败
         virtual bool  GetIsDifferent()const = 0;

         /// \brief 获取视口的显示锁定状态
         /// 
         /// \return 返回视口的显示锁定状态。true表示被锁定，false表示未被锁定。
         virtual bool IsLocked() const = 0;

         /// \brief 视口加显示锁定
         ///
         /// 锁定后，视口框与视口内容的相对位置不能发生变化
         /// \return 返回true表示加显示锁定成功，否则失败
         virtual bool Lock() = 0;

         /// \brief 视口去显示锁定
         ///
         /// \return 返回true表示去显示锁定成功，否则失败
         virtual bool Unlock() = 0;

         /// \brief 是否被激活
         /// 
         /// \return 返回true表示是激活的，否则表示未被激活。
         virtual bool IsActive() const = 0;

         /// \brief 视口激活
         ///
         /// \return 返回true表示激活成功，否则激活失败
         virtual bool Activate() = 0;

         /// \brief 视口去激活
         ///
         /// \return 返回true表示去激活成功，否则去激活失败
         virtual bool Deactivate() = 0;

         /// \brief 设置视口框可见性
         ///
         /// 默认为GraphicsNodeVisibility::Always
         /// \param frameVisibility 详细参见枚举GraphicsNodeVisibility类型取值范围
         /// \return 返回true表示设置成功，false表示设置失败
         virtual bool SetFrameVisibility(GraphicsNodeVisibility frameVisibility) = 0;

         /// \brief 获取视口框可见性
         ///
         /// \return 视口框可见性。详细请参见枚举GraphicsNodeVisibility类型取值范围
         virtual GraphicsNodeVisibility GetFrameVisibility() const = 0;

         /// \brief 获取视口位置或尺寸变化关联更新RdId
         ///
         /// \return 视口位置或尺寸变化关联更新RdId
         virtual RegenDataId GetViewportPositionOrSizeChangeRdId() const = 0;

         /// \brief 获取Implementation Uid
         ///
         /// \return UniIdentity 返回ImplementationUid
         static UniIdentity GetImplementationUid();

         /// \brief 鼠标左键双击时，是否激活视口
         ///
         /// 默认值为true，即鼠标左键双击时，默认情况下会激活视口，进入编辑状态。
         /// \return 返回true表示激活视口，返回false表示不激活视口
         virtual bool IsEnableActive() const = 0;

         /// \brief 设置鼠标左键双击时，是否激活视口
         ///
         /// 保存文件时如果视口是激活状态，那么打开之后，如果需要禁用双击视口激活的行为，产品端需要先将激活的视口做反激活处理，进行文档升级，然后再设置该标志位为false。
         /// \param isEnableActive 设置鼠标双击是否使能视口激活
         /// \return 返回true表示设置成功，返回false表示设置失败
         virtual bool SetIsEnableActive(bool isEnableActive) = 0;

         /// \brief 所属图纸上有其他激活视口时，鼠标左键双击视口是否能够激活
         ///
         /// 默认值为false，即鼠标左键双击时，不会切换两个视口之间的激活状态。
         /// \return 返回true表示激活双击的视口，并且反激活之前图纸上的激活视口，返回false表示不激活视口
         virtual bool IsSwitchActiveState() = 0;

         /// \brief 所属图纸上有其他激活视口时，设置鼠标左键双击视口是否能够激活
         ///
         /// \param isSwitchActiveState 设置激活视口存在时，鼠标双击是否使能视口激活
         /// \return 返回true表示设置成功，返回false表示设置失败
         virtual bool SetIsSwitchActiveState(bool isSwitchActiveState) = 0;

         virtual std::vector<ElementId> CreateAuxiliaryElements(gcmp::IModelView* pModelView) const=0;
    };

}
